package cn.ike.web.controller.cargo;

import cn.ike.domain.cargo.*;
import cn.ike.domain.vo.ExportProductVo;
import cn.ike.domain.vo.ExportResult;
import cn.ike.domain.vo.ExportVo;
import cn.ike.service.cargo.ContractService;
import cn.ike.service.cargo.ExportProductService;
import cn.ike.service.cargo.ExportService;
import cn.ike.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import lombok.extern.log4j.Log4j;
import org.apache.cxf.jaxrs.client.WebClient;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@Controller
@Log4j
@RequestMapping("/cargo/export")
public class ExportController extends BaseController {

    @Reference
    private ContractService contractService;

    @Reference
    private ExportService exportService;

    @Reference
    private ExportProductService exportProductService;

    /**
     * 合同管理，显示状态为1的购销合同
     */
    @RequestMapping("/contractList")
    public ModelAndView list(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "5") Integer pageSize) {
        ModelAndView model = new ModelAndView();
        try {
            log.info("执行合同列表分页查询开始...");
            // 创建查询对象
            ContractExample contractExample = new ContractExample();
            contractExample.createCriteria().andStateEqualTo(1);
            PageInfo<Contract> pageInfo = contractService.findByPage(contractExample, pageNum, pageSize);
            model.addObject("pageInfo", pageInfo);
            model.setViewName("cargo/export/export-contractList");
            log.info("执行合同列表分页查询结束...");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行合同列表分页查询出现异常！", e);
        }
        return model;
    }

    /**
     * 报运单列表分页
     */
    @RequestMapping("/list")
    public ModelAndView exportList(@RequestParam(defaultValue = "1") Integer pageNum,
                                   @RequestParam(defaultValue = "5") Integer pageSize) {
        ModelAndView model = new ModelAndView();
        try {
            log.info("执行合同管理查询开始....");
            // 创建查询对象
            ExportExample example = new ExportExample();
            // 根据创建时间倒序排序..
            example.setOrderByClause("create_time desc");
            ExportExample.Criteria criteria = example.createCriteria();
            // 添加查询条件: companyId
            criteria.andCompanyIdEqualTo(getLoginCompanyId());
            // 分页查询
            PageInfo<Export> pageInfo =
                    exportService.findByPage(example, pageNum, pageSize);
            /*String msg = (String) session.getAttribute("msg");
            session.removeAttribute("msg");
            if (!StringUtils.isEmpty(msg)){
                model.addObject("msg", msg);
            }*/
            model.addObject("pageInfo", pageInfo);
            model.setViewName("cargo/export/export-list");
            log.info("执行合同管理查询结束...");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行合同管理查询出现异常！", e);
        }
        return model;
    }

    /**
     * 报运单，进入添加页面
     * 请求参数：
     * id  多个购销合同的id，自动以逗号隔开
     */
    @RequestMapping("/toExport")
    public ModelAndView toExport(String id) {
        ModelAndView model = new ModelAndView();
        model.addObject("id", id);
        model.setViewName("cargo/export/export-toExport");
        return model;
    }

    /**
     * 报运单添加或修改
     */
    @RequestMapping("/edit")
    public ModelAndView edit(Export export) {
        ModelAndView model = new ModelAndView();
        try {
            if (StringUtils.isEmpty(export.getId())) {
                log.info("执行报运单添加开始...");
                export.setCreateBy(getLoginUser().getId());
                export.setCreateDept(getLoginUser().getDeptId());
                export.setCompanyId(getLoginCompanyId());
                export.setCompanyName(getLoginCompanyName());
                exportService.save(export);
                log.info("执行报运单添加结束...");
            } else {
                log.info("执行报运单修改开始...");
                exportService.update(export);
                log.info("执行报运单修改结束...");
            }
            // 重定向到列表
            model.setViewName("redirect:/cargo/export/list");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行报运单添加或修改出现异常！", e);
        }
        return model;
    }

    /**
     * 报运单修改，进入修改页面
     */
    @RequestMapping("/toUpdate")
    public ModelAndView toUpdate(String id) {
        ModelAndView model = new ModelAndView();
        try {
            log.info("执行进入修改页面开始...");
            // 1. 根据报运单的id查询报运单
            Export export = exportService.findById(id);
            // 2. 根据报运单的id查询报运的商品
            ExportProductExample exportProductExample = new ExportProductExample();
            exportProductExample.createCriteria().andExportIdEqualTo(id);
            List<ExportProduct> eps = exportProductService.findAll(exportProductExample);

            // 保存
            model.addObject("export", export);
            model.addObject("eps", eps);
            model.setViewName("cargo/export/export-update");
            log.info("执行进入修改页面结束...");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行进入修改页面出现异常！", e);
        }
        return model;
    }

    /**
     * 报运单的提交、取消
     */
    @RequestMapping("/submit")
    public ModelAndView submit(String id) {
        ModelAndView model = new ModelAndView();
        try {
            log.info("执行报运单的提交开始...");
            Export export = new Export();
            export.setId(id);
            export.setState(1);
            exportService.update(export);
            model.setViewName("redirect:/cargo/export/list");
            log.info("执行报运单的提交结束...");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行报运单的提交出现异常！", e);
        }
        return model;
    }

    @RequestMapping("/cancel")
    public ModelAndView cancel(String id) {
        ModelAndView model = new ModelAndView();
        try {
            log.info("执行报运单的取消开始...");
            Export export = new Export();
            export.setId(id);
            export.setState(0);
            exportService.update(export);
            model.setViewName("redirect:/cargo/export/list");
            log.info("执行报运单的取消结束...");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行报运单的取消出现异常！", e);
        }
        return model;
    }

    /**
     * 电子报运, 远程访问海关报运平台。
     * jk_export： 这个项目就是我们模拟的海关报运平台，必须要先启动
     * <p>
     * 电子报运接口地址：http://localhost:8082/ws/export/user
     * 查看报运结果地址：http://localhost:1092/ws/export/user/100
     */
    @RequestMapping("exportE")
    public ModelAndView exportE(String id) {
        ModelAndView model = new ModelAndView();
        try {
            log.info("执行电子报运开始...");
            // 封装webservice请求的参数：ExportVo
            ExportVo exportVo = new ExportVo();

            Export export = exportService.findById(id);

            // 封装数据 源 --》 目标
            BeanUtils.copyProperties(export, exportVo);

            // 设置报运单id
            exportVo.setExportId(id);

            // 根据报运单id查询商品
            ExportProductExample exportProductExample = new ExportProductExample();
            exportProductExample.createCriteria().andExportIdEqualTo(id);
            List<ExportProduct> productList = exportProductService.findAll(exportProductExample);
            // 获取exportVo中商品的集合
            List<ExportProductVo> productVos = exportVo.getProducts();
            // 遍历报运单中的商品 进行 封装
            if (productList != null && productList.size() > 0) {
                for (ExportProduct exportProduct : productList) {
                    // 创建 报运商品对象
                    ExportProductVo productVo = new ExportProductVo();
                    // 封装数据
                    BeanUtils.copyProperties(exportProduct, productVo);
                    // 设置报运单id 和 报运商品id
                    productVo.setExportId(id);
                    productVo.setExportProductId(exportProduct.getId());

                    // 添加到集合
                    productVos.add(productVo);
                }
            }
            //电子报运(1) 录入报运单数据到海关报运平台的数据库
            WebClient.create("http://localhost:8082/ws/export/user").post(exportVo);
            //电子报运(2) 查询报运的结果
            ExportResult exportResult = WebClient.create("http://localhost:8082/ws/export/user/" + id).get(ExportResult.class);
            // 修改数据库，更新报运单的状态、商品交税金额
            exportService.updateExport(exportResult);
            model.setViewName("redirect:/cargo/export/list");
            log.info("执行电子报运结束...");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行电子报运出现异常！", e);
        }
        return model;
    }

}
